package fr.noe.amicaleloisirs.concours.view;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.VerticalPanel;

import fr.noe.amicaleloisirs.concours.business.Player;
import fr.noe.amicaleloisirs.concours.business.Team;
import fr.noe.amicaleloisirs.concours.client.BeloteClient;
import fr.noe.amicaleloisirs.concours.interfaces.CallbackHandler;
import fr.noe.amicaleloisirs.concours.utils.HandlerHelper;
import fr.noe.amicaleloisirs.concours.utils.Logger;
import gwtquery.plugins.droppable.client.gwt.DroppableWidget;

public class DemarrerConcoursPanel extends AbsolutePanel {
	
	private final Image lancerConcours = new Image("./images/cartes.jpg");
	
	public DemarrerConcoursPanel(final EquipesPanel equipesPanel) {
		
		super();
		
		setStyleName("demarrer-concours");
		
		HandlerHelper.addMouseOverHandler(lancerConcours);
		HandlerHelper.addMouseOutHandler(lancerConcours);
		lancerConcours.setTitle("Cliquez sur cette image pour lancer le concours");
		
		add(lancerConcours, 170, 50);
		
		lancerConcours.addClickHandler(new ClickHandler() {
			
			public void onClick(ClickEvent event) {
				new ConfirmPopUp("Vous allez quitter cette page et démarrer le concours", new CallbackHandler() {
					
					public void onValidate() {
						FlexTable equipesTable = equipesPanel.getEquipesList();
						List<Player> seuls = new ArrayList<Player>();
						List<Player> joueurs = new ArrayList<Player>();
						List<Player> dejaPresent = new ArrayList<Player>();
						List<Team> teams = new ArrayList<Team>();
						for (int i = 0; i < equipesTable.getRowCount(); i++) {
							DroppableWidget<TextBoxWithData<Player>> dropPlayer1 = (DroppableWidget<TextBoxWithData<Player>>) equipesTable.getWidget(i, 0);
							DroppableWidget<TextBoxWithData<Player>> dropPlayer2 = (DroppableWidget<TextBoxWithData<Player>>) equipesTable.getWidget(i, 1);
							TextBoxWithData<Player> j1 = dropPlayer1.getOriginalWidget();
							TextBoxWithData<Player> j2 = dropPlayer2.getOriginalWidget();
							if ((j1.getData() != null) && (j2.getData() == null)) {
								if (!joueurs.contains(j1)) {
									seuls.add(j1.getData());
									joueurs.add(j1.getData());
								}
								else {
									dejaPresent.add(j1.getData());
								}
							}
							else if ((j1.getData() == null) && (j2.getData() != null)) {
									if (!joueurs.contains(j2)) {
										seuls.add(j2.getData());
										joueurs.add(j2.getData());
									}
									else {
										dejaPresent.add(j2.getData());
									}
							}
							else if ((j1.getData() != null) && (j2.getData() != null)) {
								boolean isOk = true;
								if (!joueurs.contains(j1.getData())) {
									joueurs.add(j1.getData());
								}
								else {
									isOk = false;
									dejaPresent.add(j1.getData());
								}
								if (!joueurs.contains(j2.getData())) {
									joueurs.add(j2.getData());
								}
								else {
									isOk = false;
									dejaPresent.add(j2.getData());
								}
								if (isOk) {
									teams.add(new Team(j1.getData(), j2.getData(), i));
								}
							}
						}
						
						// si ok
						if ((seuls.isEmpty()) && (dejaPresent.isEmpty())) {
							log("composition des équipes OK, on peut démarrer");
							
							disableAlreadyValidated(equipesPanel);
							BeloteClient.get().startConcours(teams);
						}
						else {
							log("erreur de composition des équipes, affichage de la PopUp récapitulant les erreurs");
							createPopUp(seuls, dejaPresent);
						}
					}
					
					public void onCancel() {
						
					}
				});
			}
		});
	}
	
	private void disableAlreadyValidated(final EquipesPanel equipesPanel) {
		FlexTable equipesTable = equipesPanel.getEquipesList();
		for (int i = 0; i < equipesTable.getRowCount(); i++) {
			DroppableWidget<TextBoxWithData<Player>> dropPlayer1 = (DroppableWidget<TextBoxWithData<Player>>) equipesTable.getWidget(i, 0);
			DroppableWidget<TextBoxWithData<Player>> dropPlayer2 = (DroppableWidget<TextBoxWithData<Player>>) equipesTable.getWidget(i, 1);
			TextBoxWithData<Player> j1 = dropPlayer1.getOriginalWidget();
			TextBoxWithData<Player> j2 = dropPlayer2.getOriginalWidget();
			
			if (j1.getData() != null) {
				j1.addStyleName("unWritable");
				dropPlayer1.setDisabled(true);
			}
			if (j2.getData() != null) {
				j2.addStyleName("unWritable");
				dropPlayer2.setDisabled(true);
			}
			if (j1.getData() != null || j2.getData() != null) {
				equipesTable.setWidget(i, 2, null);
			}
		}
	}
	
	private static void log(String text) {
		Logger.get().logWithClass("DemarrerConcoursPanel", text);
	}
	
	private void createPopUp(List<Player> seuls, List<Player> dejaPresent) {
        final DialogBox dialog = new DialogBox();
        dialog.setGlassEnabled(true);
        dialog.setModal(true);
    
        VerticalPanel vPanel = new VerticalPanel();
        vPanel.addStyleName("dialogVPanel");
        vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
    
        dialog.setTitle("Erreurs trouvées");
        dialog.setText("Erreurs trouvées");
        for (int i = 0 ; i < dejaPresent.size() ; i++) {
                vPanel.add(new HTML(" - " + dejaPresent.get(i).getFirstname() + " " + dejaPresent.get(i).getLastname()
                        + " est présent dans plusieurs équipes.<br/>"));
        }
        vPanel.add(new HTML("<br/>"));
        for (int i = 0 ; i < seuls.size() ; i++) {
                vPanel.add(new HTML(" - " + seuls.get(i).getFirstname() + " " + seuls.get(i).getLastname()
                        + " n'a pas de partenaire.<br/>"));
        }
        vPanel.add(new HTML("<br/>"));
        Button ok = new Button("OK");
        ok.addClickHandler(new ClickHandler() {
    
                public void onClick(ClickEvent event) {
                        dialog.hide();
                }
        });
        vPanel.add(ok);
        dialog.setWidget(vPanel);
        dialog.center();
    }

}
